ゲームプログラムの構造
▼ 大きなプログラムを作るには 今回作るゲームプログラムはソフトウェア的に見ると中規模プログラムです。 何をもって中規模と言えるのかは不明ですが、大規模なシステムと言えるほどの ものではなく、かと言って小物プログラム程度のものではありません。 中規模プログラムとは感覚的に言って、 ・実行形式が100KB以上 ・ソースリスト(*.c)が10ファイル以上 …とこんなところでしょうか。小物プログラムであれば即興と力技でもプログ ラムを完成させる事ができますが、中規模プログラムともなるとそれだけで完成 させる事は困難です。見え見えの結論ではありますが、やはり中規模プログラム を作るには、 ・設計 が重要です。では設計とは何でしょう。C言語の場合、 ・関数の機能(どのような機能の関数を作るか) ・関数の依存関係(どの関数がどの関数を呼んでいるか) ・データ構造(配列、構造体、テーブル、リスト…) をプログラミングに入る前にしっかりと決めておく、それが設計です。集団作 業を行う職業プログラマーであれば、これらの設計は「仕様書」として書き留め て紙にプリントアウトして上司なりクライアントなりに提出するのでしょうが、 今回の場合のように作ったプログラムを雑誌に載せて公開しよう、という場合は そこまでする必要はないと思います。しかも今回は作るのがゲームプログラムと いう事もあり、実際に遊んでみて仕様をどんどん変えていくという事が想定され ます。その度に仕様書を書き換えていくのは大変ですし、仕様書の管理も大変で す。 そこで一番良いのは(楽なのは)、 ・ソースプログラムが仕様書になっている という事だと断言してしまいましょう。これならば不精なプログラマーでもな んとかなる範囲です。具体的にはやはりソースにコメントを付けておく事でしょ う。 ・関数の機能に関するコメント ・関数の引き数/返り値に関するコメント ・変数の使用目的のコメント をこまめに付けておくだけでも随分違います。これらのコメントが適切に付け てあればソースを眺めているだけでなんとなく仕様が頭に入って来ることでしょ う。 話がだいぶそれてきましたが、この項での結論は、 ・設計が重要 ・仕様書を書け、もし面倒ならばソースが仕様書になるよう努力する という2点です。 ▼ ボトムアップかトップダウンか では今回のお題であるシューティングゲームの構造について考察します。手元 にシューティングゲームを用意して画面をよーく眺めて下さい。シューティング ゲームにはどのような処理が必要でしょうか。 ・ジョイスティックに合わせて自機が移動する ・ショットボタンを押すと弾が発射される ・弾が敵に当たると敵が爆発する ・敵が爆発すると得点が入る ・ある程度進むとボスキャラが登場する ・ボスキャラを倒すと1面クリア ・全面クリアすると終了もしくは2周目に突入 ・等々… このような処理をプログラムすることにより、ゲームは完成します。このよう に必要な小さな処理(モジュール)を組み合わせていくのがボトムアップと呼ば れる手法です。ボトムアップは処理内容が具体的で判り易い反面、やはり全体の 見通しが悪くなるという欠点があります。 トップダウンという設計手法は全体の構造を把握した上でそれらを小さな構造 に切り分けていくという手法です。見通しが良い反面、最初のうちは対象が大き すぎて途方に暮れてしまうという欠点があります。でもまあそれは自分の頭で全 て考えて構造を作るという話。シューティングゲームに関しては比較的ポピュラー な構造が知られていますので、今回も基本的にはそれに従っていく事にします。 但し既に用意されているライブラリ(XSP関連、IOCS関連等)が既にある事から、 これらのライブラリを活かす方向で作っていくので完全なトップダウンというわ けではありません。現実的にはこのような「既存の資産を活かした上でのトップ ダウン」が多いのではないでしょうか。また、トップダウンによってある程度全 体の構造が見えてきたらボトムアップの手法で各モジュールを作成していく事も 有効ですので今回はこの手法を採用することにします。 ▼ 構造と要素 次に各関数の構造を見ていくのですが、ここで本文は以下の2つに分岐します。 ・要素研究 ・構造研究 要素研究では既存の関数(と、その組み合わせ)で何ができるかという事を研 究します。例えば「ジョイスティック入力ルーチン」「画面モード設定ルーチン」 「スプライト標準ルーチン」等々。プログラマーにとって初めての技術をいきな り本番のプログラムに導入すると取れないバグの元になるので予め小さなサンプ ルプログラムで研究しておこうという魂胆です。先ほどの議論で言うところのボ トムアップ的な観点です。 構造研究は各関数をどのような構造にするかの研究です。 要素と構造は密接に関係しあっているため、どちらかを先に済ませるという事 は困難です。「どのような要素を研究すれば良いか」は構造が決まっていないと わかりませんし、逆に「どのような構造にすれば良いか」を知るためには各要素 がある程度わかっている必要があります。卵が先か鶏が先か…のような問題なの ですが、ここは思い切って要素研究を先に行ってしまいます。「何故このような 要素が必要なのか?」という疑問が湧くことがあるかと思いますが、それは後ほ どの構造研究によって明らかにされます。 (EOF)